package com.yxp.offer;

import com.yxp.util.PrintUtil;

/**
 * @author : yang.xp
 * @date : 2021/9/3 11:37
 * @description : 剑指 Offer 56 - II. 数组中数字出现的次数 II
 * 在一个数组 nums 中除一个数字只出现一次之外，其他数字都出现了三次。请找出那个只出现一次的数字。
 */
public class Problem56_2 {

    public static void main(String[] args) {
        Problem56_2 problem56_2 = new Problem56_2();
        System.out.println(problem56_2.singleNumber(new int[]{4, 6, 4, 14}));
    }


    public int singleNumber(int[] nums) {
        int[] k = new int[32];
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < 32; j++) {
                // 如何让数字的二进制每个位上10进制的方式相加？右移j位之后，与000001比较
                // 一个数的二进制与001进行与运算，可以通过结果来判断是否最低位是1.
                k[j] += (nums[i] >> j & 1) == 1 ? 1 : 0;
            }
        }
        int res = 0;
        for (int i = 31; i >= 0; i--) {
            // 通过移位的方式，再移过来
            res = res << 1;
            if (k[i] % 3 == 1) {
                res = (res | 1);
            }
        }
        return res;
    }
}
